Je vous en avais parlé il y a quelques temps, SharePoint dispose maintenant du support de plusieurs langues d’interface. C’est simple à mettre en place, mais il y a tout de même quelques limitations. En effet :
- il faut bien le spécifier manuellement dans les paramètres du site
- et le faire pour chaque site car il n’y a pas de réglage au niveau de la collection
Du coup, lorsque vous désirez le faire dans toute une collection et pour chaque site créé, et bien c’est un petit peu plus galère.
Etape 1 – Appliquer une configuration donnée
C’est pour cela que j’ai pensé développer une première fonctionnalité de scope “Web” qui, sur activation, paramètre le site de la même manière que le site racine. Ainsi, je paramètre une fois pour toute sur la racine de ma collection et j’active la fonctionnalité sur les sites qui m’intéressent.
Le code est assez trivial, il se contente de regarder les langues configurées sur le site racine, les comparer avec celle(s) présente(sà sur le site courant et appliquer les modifications.
J’ai donc un événement sur activation qui regarde sur le site racine est multilingue (i.e. à le MUI activé, propriété “IsMultilingual” de SPWeb), récupération des “SupportedUICultures” de celui-ci et de celles du site courant et ajout des manquantes via la méthode “AddSupportedUICulture” (il y a évidemment l’équivalent pour les retirer).
1: public override void FeatureActivated(SPFeatureReceiverProperties properties)
2: { 3: SPWeb web = properties.Feature.Parent as SPWeb;
4: if (web != null && !web.IsMultilingual && !web.IsRootWeb)
5: { 6: using (SPSite site = web.Site)
7: { 8: using (SPWeb rootWeb = site.RootWeb)
9: { 10: if (rootWeb.IsMultilingual)
11: { 12: List<CultureInfo> culturesToAdd = new List<CultureInfo>();
13: foreach (CultureInfo ci in rootWeb.SupportedUICultures)
14: { 15: culturesToAdd.Add(ci);
16: }
17: foreach (CultureInfo ci in web.SupportedUICultures)
18: { 19: if (culturesToAdd.Contains(ci))
20: { 21: culturesToAdd.Remove(ci);
22: }
23: }
24:
25: if (culturesToAdd.Count > 0)
26: { 27: try
28: { 29: web.AllowUnsafeUpdates = true;
30: web.IsMultilingual = true;
31: foreach (CultureInfo ci in culturesToAdd)
32: { 33: web.AddSupportedUICulture(ci);
34: }
35: web.Update();
36: }
37: catch (Exception ex)
38: { 39: Debug.WriteLine(ex.Message, this.GetType().FullName);
40: }
41: }
42: }
43: }
44: }
45: }
46: }
Important : notez bien que l’exception sert bien à quelque chose car certains modèles de site ne supportent pas le MUI, le blog par exemple.
Etape 2 – L’appliquer automatiquement
Maintenant, plutôt que d’activer la fonctionnalité à chaque fois, on crée un stapler pour l’activer pour chaque nouveau site. Donc nouvelle fonctionnalité de scope “Site” ce coup-ci (vous pouvez imaginer le mettre au niveau de la webapp ou de la ferme si le coeur vous en dit) avec l’élément suivant :
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<FeatureSiteTemplateAssociation Id="6b365f3c-df20-45a3-a538-bb00aa62689a" TemplateName="GLOBAL" />
<FeatureSiteTemplateAssociation Id="6b365f3c-df20-45a3-a538-bb00aa62689a" TemplateName="STS#1" />
</Elements>
Remarque : modèle de site vide est spécifique et n’applique pas par défaut les staplers, il faut donc bien veiller à l’ajouter dans les associations (STS#1)
Etape 3 – Et si je désire activer tout ça en court de route ?
Et oui, le stapling c’est bien pratique, mais les sites déjà créés n’en profitent pas. J’ai donc rajouté un événement sur la fonctionnalité précédente (d’où le scope “Site”) qui parcourt les sites et active la fonctionnalité si elle n’est pas présente. Simple non ?
1: Guid stapledFeature = new Guid("6b365f3c-df20-45a3-a538-bb00aa62689a"); 2:
3: public override void FeatureActivated(SPFeatureReceiverProperties properties)
4: { 5: SPSite site = properties.Feature.Parent as SPSite;
6: if (site != null)
7: { 8: foreach (SPWeb web in site.AllWebs)
9: { 10: if (web.Features[stapledFeature] == null)
11: { 12: web.Features.Add(stapledFeature);
13: }
14: web.Dispose();
15: }
16: }
17: }
Et voilà, le tour este joué. Et si vous n’avez pas envie de le faire vous-même, et bien vous n’avez qu’à télécharger le projet depuis MSDN Code Gallery.
Gat, fan du MUI